package 炫彩元素类

import (
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
)

// X结构_滚动条 滚动条.
type X结构_滚动条 struct {
	X结构_基础元素
}

// 滚动条_创建, 创建滚动条元素, 返回元素句柄.
//
// x: 元素x坐标.
//
// y: 元素y坐标.
//
// cx: 宽度.
//
// cy: 高度.
//
// hParent: 父是窗口资源句柄或UI元素资源句柄. 如果是窗口资源句柄将被添加到窗口, 如果是元素资源句柄将被添加到元素.
func X创建滚动条(元素x坐标, 元素y坐标, 宽度, 高度 int32, 父窗口句柄 int) *X结构_滚动条 {
	p := &X结构_滚动条{}
	p.X设置句柄(xc.X滚动条_创建(元素x坐标, 元素y坐标, 宽度, 高度, 父窗口句柄))
	return p
}

// 从句柄创建对象.
func X创建滚动条并按句柄(句柄 int) *X结构_滚动条 {
	p := &X结构_滚动条{}
	p.X设置句柄(句柄)
	return p
}

// 从name创建对象, 失败返回nil.
func X创建滚动条并按名称(名称 string) *X结构_滚动条 {
	handle := xc.X取对象并按名称(名称)
	if handle > 0 {
		p := &X结构_滚动条{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 从UID创建对象, 失败返回nil.
func X创建滚动条并按UID(UID int32) *X结构_滚动条 {
	handle := xc.X取对象并按UID(UID)
	if handle > 0 {
		p := &X结构_滚动条{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 从UID名称创建对象, 失败返回nil.
func X创建滚动条并按UID名称(名称 string) *X结构_滚动条 {
	handle := xc.X取对象并按UID名称(名称)
	if handle > 0 {
		p := &X结构_滚动条{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 滚动条_置范围, 设置滚动范围.
//
// range_: 范围.
func (s *X结构_滚动条) X设置范围(范围 int32) *X结构_滚动条 {
	xc.X滚动条_设置范围(s.X句柄, 范围)
	return s
}

// 滚动条_取范围, 获取滚动范围.
func (s *X结构_滚动条) X取范围() int32 {
	return xc.X滚动条_取范围(s.X句柄)
}

// 滚动条_显示上下按钮, 显示隐藏滚动条上下按钮.
//
// bShow: 是否显示.
func (s *X结构_滚动条) X显示上下按钮(是否显示 bool) *X结构_滚动条 {
	xc.X滚动条_显示上下按钮(s.X句柄, 是否显示)
	return s
}

// 滚动条_置滑块长度.
//
// length: 长度.
func (s *X结构_滚动条) X设置滑块长度(长度 int32) *X结构_滚动条 {
	xc.X滚动条_设置滑块长度(s.X句柄, 长度)
	return s
}

// 滚动条_置滑块最小长度.
//
// minLength: 长度.
func (s *X结构_滚动条) X设置滑块最小长度(长度 int32) *X结构_滚动条 {
	xc.X滚动条_设置滑块最小长度(s.X句柄, 长度)
	return s
}

// 滚动条_置滑块两边间隔, 设置滑块两边的间隔大小.
//
// nPadding: 间隔大小.
func (s *X结构_滚动条) X设置滑块两边间隔(间隔大小 int32) *X结构_滚动条 {
	xc.X滚动条_设置滑块两边间隔(s.X句柄, 间隔大小)
	return s
}

// 滚动条_置水平, 设置水平或者垂直.
//
// bHorizon: 水平或垂直.
func (s *X结构_滚动条) X设置水平(水平或垂直 bool) bool {
	return xc.X滚动条_设置水平(s.X句柄, 水平或垂直)
}

// 滚动条_取滑块最大长度.
func (s *X结构_滚动条) X取滑块最大长度() int32 {
	return xc.X滚动条_取滑块最大长度(s.X句柄)
}

// 滚动条_向上滚动.
func (s *X结构_滚动条) X向上滚动() bool {
	return xc.X滚动条_向上滚动(s.X句柄)
}

// 滚动条_向下滚动.
func (s *X结构_滚动条) X向下滚动() bool {
	return xc.X滚动条_向下滚动(s.X句柄)
}

// 滚动条_滚动到顶部.
func (s *X结构_滚动条) X滚动到顶部() bool {
	return xc.X滚动条_滚动到顶部(s.X句柄)
}

// 滚动条_滚动到底部.
func (s *X结构_滚动条) X滚动到底部() bool {
	return xc.X滚动条_滚动到底部(s.X句柄)
}

// 滚动条_滚动到指定位置, 滚动到指定位置点, 触发事件: XE_SBAR_SCROLL.
//
// pos: 位置点.
func (s *X结构_滚动条) X滚动到指定位置(位置点 int32) bool {
	return xc.X滚动条_滚动到指定位置(s.X句柄, 位置点)
}

// 滚动条_取上按钮, 获取上按钮, 返回按钮句柄.
func (s *X结构_滚动条) X取上按钮() int {
	return xc.X滚动条_取上按钮(s.X句柄)
}

// 滚动条_取下按钮, 获取下按钮, 返回按钮句柄.
func (s *X结构_滚动条) X取下按钮() int {
	return xc.X滚动条_取下按钮(s.X句柄)
}

// 滚动条_取滑块, 获取滑动按钮, 返回按钮句柄.
func (s *X结构_滚动条) X取滑块() int {
	return xc.X滚动条_取滑块(s.X句柄)
}

// ------------------------- 事件 ------------------------- //

type X事件_滚动条_滚动 func(pos int32, pbHandled *bool) int            // 滚动条元素滚动事件,滚动条触发.
type X事件_滚动条_滚动1 func(hEle int, pos int32, pbHandled *bool) int // 滚动条元素滚动事件,滚动条触发.

// 滚动条元素滚动事件,滚动条触发.
func (s *X结构_滚动条) X事件_滚动(回调函数 X事件_滚动条_滚动) bool {
	return xc.X元素_注册事件C(s.X句柄, xcc.X元素事件_滚动条_滚动事件, 回调函数)
}

// 滚动条元素滚动事件,滚动条触发.
func (s *X结构_滚动条) X事件_滚动1(回调函数 X事件_滚动条_滚动1) bool {
	return xc.X元素_注册事件C1(s.X句柄, xcc.X元素事件_滚动条_滚动事件, 回调函数)
}

// ------------------------- AddEvent ------------------------- //

// AddEvent_SBar_Scroll 添加滚动条元素滚动事件.
//
// pFun: 回调函数.
//
// allowAddingMultiple: 允许添加多个回调函数.
func (s *X结构_滚动条) AddEvent_SBar_Scroll(pFun X事件_滚动条_滚动1, allowAddingMultiple ...bool) int {
	return EventHandler.AddCallBack(s.X句柄, xcc.X元素事件_滚动条_滚动事件, onXE_SBAR_SCROLL, pFun, allowAddingMultiple...)
}

// onXE_SBAR_SCROLL 滚动条元素滚动事件处理.
func onXE_SBAR_SCROLL(hEle int, pos int32, pbHandled *bool) int {
	cbs := EventHandler.GetCallBacks(hEle, xcc.X元素事件_滚动条_滚动事件)
	var ret int
	for i := len(cbs) - 1; i >= 0; i-- {
		if cbs[i] != nil {
			ret = cbs[i].(X事件_滚动条_滚动1)(hEle, pos, pbHandled)
			if *pbHandled {
				break
			}
		}
	}
	return ret
}
